--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
tests/backend/test_meshchat_coverage.py 14b1b788bf6e0dd00e847272ca2ab69c3c8c7a34 (14b1b788) Text, 24.21 KB
T8b949e# SPDX-License-Identifier: 0BSD
Tff7b72import T7ee787asyncio
Tff7b72import T7ee787json
Tff7b72import T7ee787os
Tff7b72from T7ee787unittestT7ee787.T7ee787mock Tff7b72import Te6edf3AsyncMockTb4b4b4, Te6edf3MagicMockTb4b4b4, Te6edf3patch
Tff7b72import T7ee787LXMF
Tff7b72import T7ee787pytest
Tff7b72from T7ee787meshchatxT7ee787.T7ee787meshchat Tff7b72import Te6edf3ReticulumMeshChat
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787lxmf_message_fields Tff7b72import Te6edf3LxmfAudioField
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787reticulum_pathfinding Tff7b72import Te6edf3OutboundPathOutcome
Tf0883e@pytestTff7b72.Td2a8fffixture
Tff7b72def Td2a8ffmock_appTb4b4b4(Tb4b4b4)Tb4b4b4:
T8b949e# Use __new__ to avoid full initialization
Te6edf3app Tff7b72= Te6edf3ReticulumMeshChatTff7b72.Td2a8ff__new__Tb4b4b4(Te6edf3ReticulumMeshChatTb4b4b4)
Te6edf3appTff7b72.Td2a8ffcurrent_context Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3appTff7b72.Td2a8ffconfig Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3appTff7b72.Td2a8ffdatabase Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3appTff7b72.Td2a8ffreticulum Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3appTff7b72.Td2a8ffmessage_router Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3appTff7b72.Td2a8ffstorage_dir Tff7b72= Ta5d6ff"Ta5d6ff/tmp/meshchat_testTa5d6ff"
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Te6edf3appTff7b72.Td2a8ffstorage_dirTb4b4b4, Te6edf3exist_okTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72return Te6edf3app
Tff7b72def Td2a8fftest_get_current_icon_hash_noneTb4b4b4(Te6edf3mock_appTb4b4b4)Tb4b4b4:
Te6edf3mock_appTff7b72.Td2a8ffconfigTff7b72.Td2a8fflxmf_user_icon_nameTff7b72.Td2a8ffgetTff7b72.Td2a8ffreturn_value Tff7b72= Tff7b72None
Tff7b72assert Te6edf3mock_appTff7b72.Td2a8ffget_current_icon_hashTb4b4b4(Tb4b4b4) Tff7b72is Tff7b72None
Tff7b72def Td2a8fftest_get_current_icon_hash_validTb4b4b4(Te6edf3mock_appTb4b4b4)Tb4b4b4:
Te6edf3mock_appTff7b72.Td2a8ffconfigTff7b72.Td2a8fflxmf_user_icon_nameTff7b72.Td2a8ffgetTff7b72.Td2a8ffreturn_value Tff7b72= Ta5d6ff"Ta5d6fficonTa5d6ff"
Te6edf3mock_appTff7b72.Td2a8ffconfigTff7b72.Td2a8fflxmf_user_icon_foreground_colourTff7b72.Td2a8ffgetTff7b72.Td2a8ffreturn_value Tff7b72= Ta5d6ff"Ta5d6ff#ffffffTa5d6ff"
Te6edf3mock_appTff7b72.Td2a8ffconfigTff7b72.Td2a8fflxmf_user_icon_background_colourTff7b72.Td2a8ffgetTff7b72.Td2a8ffreturn_value Tff7b72= Ta5d6ff"Ta5d6ff#000000Ta5d6ff"
Te6edf3icon_hash Tff7b72= Te6edf3mock_appTff7b72.Td2a8ffget_current_icon_hashTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3icon_hash Tff7b72is Tff7b72not Tff7b72None
Tff7b72assert Tffa657lenTb4b4b4(Te6edf3icon_hashTb4b4b4) Tff7b72== T79c0ff64
Tff7b72def Td2a8fftest_parse_boolTb4b4b4(Te6edf3mock_appTb4b4b4)Tb4b4b4:
Tff7b72assert Te6edf3mock_appTff7b72.Td2a8ff_parse_boolTb4b4b4(Tff7b72TrueTb4b4b4) Tff7b72is Tff7b72True
Tff7b72assert Te6edf3mock_appTff7b72.Td2a8ff_parse_boolTb4b4b4(Ta5d6ff"Ta5d6fftrueTa5d6ff"Tb4b4b4) Tff7b72is Tff7b72True
Tff7b72assert Te6edf3mock_appTff7b72.Td2a8ff_parse_boolTb4b4b4(Ta5d6ff"Ta5d6ffTrueTa5d6ff"Tb4b4b4) Tff7b72is Tff7b72True
Tff7b72assert Te6edf3mock_appTff7b72.Td2a8ff_parse_boolTb4b4b4(Tff7b72FalseTb4b4b4) Tff7b72is Tff7b72False
Tff7b72assert Te6edf3mock_appTff7b72.Td2a8ff_parse_boolTb4b4b4(Ta5d6ff"Ta5d6fffalseTa5d6ff"Tb4b4b4) Tff7b72is Tff7b72False
Tff7b72assert Te6edf3mock_appTff7b72.Td2a8ff_parse_boolTb4b4b4(Ta5d6ff"Ta5d6ffnoTa5d6ff"Tb4b4b4) Tff7b72is Tff7b72False
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_update_config_display_nameTb4b4b4(Te6edf3mock_appTb4b4b4)Tb4b4b4:
Te6edf3data Tff7b72= Tb4b4b4{Ta5d6ff"Ta5d6ffdisplay_nameTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffNew NameTa5d6ff"Tb4b4b4}
Te6edf3mock_appTff7b72.Td2a8ffupdate_identity_metadata_cache Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3mock_appTff7b72.Td2a8ffsend_config_to_websocket_clients Tff7b72= Te6edf3MagicMockTb4b4b4(Te6edf3return_valueTff7b72=Te6edf3asyncioTff7b72.Td2a8ffFutureTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3mock_appTff7b72.Td2a8ffsend_config_to_websocket_clientsTff7b72.Td2a8ffreturn_valueTff7b72.Td2a8ffset_resultTb4b4b4(Tff7b72NoneTb4b4b4)
Tff7b72await Te6edf3mock_appTff7b72.Td2a8ffupdate_configTb4b4b4(Te6edf3dataTb4b4b4)
Te6edf3mock_appTff7b72.Td2a8ffconfigTff7b72.Td2a8ffdisplay_nameTff7b72.Td2a8ffsetTff7b72.Td2a8ffassert_called_withTb4b4b4(Ta5d6ff"Ta5d6ffNew NameTa5d6ff"Tb4b4b4)
Te6edf3mock_appTff7b72.Td2a8ffupdate_identity_metadata_cacheTff7b72.Td2a8ffassert_called_onceTb4b4b4(Tb4b4b4)
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_update_config_themeTb4b4b4(Te6edf3mock_appTb4b4b4)Tb4b4b4:
Te6edf3data Tff7b72= Tb4b4b4{Ta5d6ff"Ta5d6ffthemeTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffdarkTa5d6ff"Tb4b4b4}
Te6edf3mock_appTff7b72.Td2a8ffsend_config_to_websocket_clients Tff7b72= Te6edf3MagicMockTb4b4b4(Te6edf3return_valueTff7b72=Te6edf3asyncioTff7b72.Td2a8ffFutureTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3mock_appTff7b72.Td2a8ffsend_config_to_websocket_clientsTff7b72.Td2a8ffreturn_valueTff7b72.Td2a8ffset_resultTb4b4b4(Tff7b72NoneTb4b4b4)
Tff7b72await Te6edf3mock_appTff7b72.Td2a8ffupdate_configTb4b4b4(Te6edf3dataTb4b4b4)
Te6edf3mock_appTff7b72.Td2a8ffconfigTff7b72.Td2a8ffthemeTff7b72.Td2a8ffsetTff7b72.Td2a8ffassert_called_withTb4b4b4(Ta5d6ff"Ta5d6ffdarkTa5d6ff"Tb4b4b4)
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_update_config_libretranslate_api_keyTb4b4b4(Te6edf3mock_appTb4b4b4)Tb4b4b4:
Te6edf3mock_appTff7b72.Td2a8ffsend_config_to_websocket_clients Tff7b72= Te6edf3MagicMockTb4b4b4(Te6edf3return_valueTff7b72=Te6edf3asyncioTff7b72.Td2a8ffFutureTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3mock_appTff7b72.Td2a8ffsend_config_to_websocket_clientsTff7b72.Td2a8ffreturn_valueTff7b72.Td2a8ffset_resultTb4b4b4(Tff7b72NoneTb4b4b4)
Te6edf3mock_appTff7b72.Td2a8ffconfigTff7b72.Td2a8fflibretranslate_api_key Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3mock_appTff7b72.Td2a8fftranslator_handler Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Tff7b72await Te6edf3mock_appTff7b72.Td2a8ffupdate_configTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6fflibretranslate_api_keyTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ff sek Ta5d6ff"Tb4b4b4}Tb4b4b4)
Te6edf3mock_appTff7b72.Td2a8ffconfigTff7b72.Td2a8fflibretranslate_api_keyTff7b72.Td2a8ffsetTff7b72.Td2a8ffassert_called_once_withTb4b4b4(Ta5d6ff"Ta5d6ffsekTa5d6ff"Tb4b4b4)
Tff7b72assert Te6edf3mock_appTff7b72.Td2a8fftranslator_handlerTff7b72.Td2a8fflibretranslate_api_key Tff7b72== Ta5d6ff"Ta5d6ffsekTa5d6ff"
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_update_config_libretranslate_api_key_empty_clearsTb4b4b4(Te6edf3mock_appTb4b4b4)Tb4b4b4:
Te6edf3mock_appTff7b72.Td2a8ffsend_config_to_websocket_clients Tff7b72= Te6edf3MagicMockTb4b4b4(Te6edf3return_valueTff7b72=Te6edf3asyncioTff7b72.Td2a8ffFutureTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3mock_appTff7b72.Td2a8ffsend_config_to_websocket_clientsTff7b72.Td2a8ffreturn_valueTff7b72.Td2a8ffset_resultTb4b4b4(Tff7b72NoneTb4b4b4)
Te6edf3mock_appTff7b72.Td2a8ffconfigTff7b72.Td2a8fflibretranslate_api_key Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3mock_appTff7b72.Td2a8fftranslator_handler Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Tff7b72await Te6edf3mock_appTff7b72.Td2a8ffupdate_configTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6fflibretranslate_api_keyTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ff"Tb4b4b4}Tb4b4b4)
Te6edf3mock_appTff7b72.Td2a8ffconfigTff7b72.Td2a8fflibretranslate_api_keyTff7b72.Td2a8ffsetTff7b72.Td2a8ffassert_called_once_withTb4b4b4(Tff7b72NoneTb4b4b4)
Tff7b72assert Te6edf3mock_appTff7b72.Td2a8fftranslator_handlerTff7b72.Td2a8fflibretranslate_api_key Tff7b72is Tff7b72None
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_update_config_libretranslate_api_key_length_limitTb4b4b4(Te6edf3mock_appTb4b4b4)Tb4b4b4:
Te6edf3mock_appTff7b72.Td2a8ffsend_config_to_websocket_clients Tff7b72= Te6edf3MagicMockTb4b4b4(Te6edf3return_valueTff7b72=Te6edf3asyncioTff7b72.Td2a8ffFutureTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3mock_appTff7b72.Td2a8ffsend_config_to_websocket_clientsTff7b72.Td2a8ffreturn_valueTff7b72.Td2a8ffset_resultTb4b4b4(Tff7b72NoneTb4b4b4)
Te6edf3mock_appTff7b72.Td2a8ffconfigTff7b72.Td2a8fflibretranslate_api_key Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3mock_appTff7b72.Td2a8fftranslator_handler Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Tff7b72with Te6edf3pytestTff7b72.Td2a8ffraisesTb4b4b4(Tf85149ValueErrorTb4b4b4)Tb4b4b4:
Tff7b72await Te6edf3mock_appTff7b72.Td2a8ffupdate_configTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6fflibretranslate_api_keyTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffzTa5d6ff" Tff7b72* T79c0ff513Tb4b4b4}Tb4b4b4)
Tff7b72def Td2a8fftest_get_config_dict_no_contextTb4b4b4(Te6edf3mock_appTb4b4b4)Tb4b4b4:
Te6edf3mock_appTff7b72.Td2a8ffcurrent_context Tff7b72= Tff7b72None
Tff7b72assert Te6edf3mock_appTff7b72.Td2a8ffget_config_dictTb4b4b4(Tb4b4b4) Tff7b72== Tb4b4b4{Tb4b4b4}
Tff7b72def Td2a8fftest_get_config_dict_basicTb4b4b4(Te6edf3mock_appTb4b4b4)Tb4b4b4:
Te6edf3ctx Tff7b72= Te6edf3mock_appTff7b72.Td2a8ffcurrent_context
Te6edf3mock_config Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3mock_appTff7b72.Td2a8ffcurrent_contextTff7b72.Td2a8ffconfig Tff7b72= Te6edf3mock_config
Te6edf3mock_configTff7b72.Td2a8ffdisplay_nameTff7b72.Td2a8ffgetTff7b72.Td2a8ffreturn_value Tff7b72= Ta5d6ff"Ta5d6ffTestTa5d6ff"
Te6edf3mock_configTff7b72.Td2a8ffthemeTff7b72.Td2a8ffgetTff7b72.Td2a8ffreturn_value Tff7b72= Ta5d6ff"Ta5d6fflightTa5d6ff"
Te6edf3mock_configTff7b72.Td2a8fflanguageTff7b72.Td2a8ffgetTff7b72.Td2a8ffreturn_value Tff7b72= Ta5d6ff"Ta5d6ffenTa5d6ff"
T8b949e# Mocking all items returned in get_config_dict
Tff7b72for Te6edf3attr Tff7b72in Tb4b4b4[
Ta5d6ff"Ta5d6ffauto_announce_enabledTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffauto_announce_interval_secondsTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fflast_announced_atTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffauto_resend_failed_messages_when_announce_receivedTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffallow_auto_resending_failed_messages_with_attachmentsTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffauto_send_failed_messages_to_propagation_nodeTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffshow_suggested_community_interfacesTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fflxmf_local_propagation_node_enabledTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fflxmf_preferred_propagation_node_destination_hashTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fflxmf_preferred_propagation_node_auto_selectTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fflxmf_preferred_propagation_node_auto_sync_interval_secondsTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fflxmf_preferred_propagation_node_last_synced_atTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fflxmf_user_icon_nameTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fflxmf_user_icon_foreground_colourTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fflxmf_user_icon_background_colourTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fflxmf_inbound_stamp_costTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fflxmf_propagation_node_stamp_costTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffpage_archiver_enabledTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffpage_archiver_max_versionsTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffarchives_max_storage_gbTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffbackup_max_countTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffcrawler_enabledTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffcrawler_max_retriesTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffcrawler_retry_delay_secondsTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffcrawler_max_concurrentTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffauth_enabledTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffvoicemail_enabledTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffvoicemail_greetingTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffvoicemail_auto_answer_delay_secondsTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffvoicemail_max_recording_secondsTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffvoicemail_tts_speedTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffvoicemail_tts_pitchTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffvoicemail_tts_voiceTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffvoicemail_tts_word_gapTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffcustom_ringtone_enabledTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffringtone_filenameTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffringtone_preferred_idTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffringtone_volumeTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffmap_offline_enabledTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffmap_mbtiles_dirTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffmap_tile_cache_enabledTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffmap_default_latTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffmap_default_lonTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffmap_default_zoomTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffmap_tile_server_urlTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffmap_nominatim_api_urlTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffdo_not_disturb_enabledTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fftelephone_allow_calls_from_contacts_onlyTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fftelephone_audio_profile_idTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fftelephone_web_audio_enabledTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fftelephone_web_audio_allow_fallbackTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffcall_recording_enabledTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffbanished_effect_enabledTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffbanished_textTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffbanished_colorTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffmessage_font_sizeTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffmessage_icon_sizeTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fftranslator_argos_enabledTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fftranslator_libretranslate_enabledTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fflibretranslate_urlTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fflibretranslate_api_keyTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffdesktop_open_calls_in_separate_windowTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffdesktop_hardware_acceleration_enabledTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffblackhole_integration_enabledTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffannounce_max_stored_lxmf_deliveryTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffannounce_max_stored_nomadnetwork_nodeTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffannounce_max_stored_lxmf_propagationTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffannounce_fetch_limit_lxmf_deliveryTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffannounce_fetch_limit_nomadnetwork_nodeTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffannounce_fetch_limit_lxmf_propagationTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffannounce_search_max_fetchTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffdiscovered_interfaces_max_returnTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffcsp_extra_connect_srcTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffcsp_extra_img_srcTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffcsp_extra_frame_srcTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffcsp_extra_script_srcTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffcsp_extra_style_srcTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fftelephone_tone_generator_enabledTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fftelephone_tone_generator_volumeTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fflocation_sourceTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fflocation_manual_latTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fflocation_manual_lonTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fflocation_manual_altTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fftelemetry_enabledTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffnomad_render_markdown_enabledTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffnomad_render_html_enabledTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffnomad_render_plaintext_enabledTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffnomad_default_page_pathTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffmessage_outbound_bubble_colorTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffmessage_inbound_bubble_colorTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffmessage_failed_bubble_colorTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffmessage_waiting_bubble_colorTa5d6ff"Tb4b4b4,
Tb4b4b4]Tb4b4b4:
Tffa657getattrTb4b4b4(Te6edf3mock_configTb4b4b4, Te6edf3attrTb4b4b4)Tff7b72.Td2a8ffgetTff7b72.Td2a8ffreturn_value Tff7b72= Tff7b72None
Te6edf3mock_configTff7b72.Td2a8ffdisplay_nameTff7b72.Td2a8ffgetTff7b72.Td2a8ffreturn_value Tff7b72= Ta5d6ff"Ta5d6ffTestTa5d6ff"
Te6edf3mock_configTff7b72.Td2a8ffthemeTff7b72.Td2a8ffgetTff7b72.Td2a8ffreturn_value Tff7b72= Ta5d6ff"Ta5d6fflightTa5d6ff"
Te6edf3mock_configTff7b72.Td2a8fflanguageTff7b72.Td2a8ffgetTff7b72.Td2a8ffreturn_value Tff7b72= Ta5d6ff"Ta5d6ffenTa5d6ff"
Te6edf3ctxTff7b72.Td2a8ffidentityTff7b72.Td2a8ffhashTff7b72.Td2a8ffhexTff7b72.Td2a8ffreturn_value Tff7b72= Ta5d6ff"Ta5d6ffabcdTa5d6ff"
Te6edf3ctxTff7b72.Td2a8ffidentityTff7b72.Td2a8ffget_public_keyTff7b72.Td2a8ffreturn_value Tff7b72= Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Ta5d6ff"Ta5d6ffa1Ta5d6ff" Tff7b72* T79c0ff32Tb4b4b4)
Te6edf3ctxTff7b72.Td2a8fflocal_lxmf_destinationTff7b72.Td2a8ffhexhash Tff7b72= Ta5d6ff"Ta5d6ffbeefTa5d6ff"
Te6edf3ctxTff7b72.Td2a8fftelephone_managerTff7b72.Td2a8fftelephone Tff7b72= Tff7b72None
Te6edf3mock_appTff7b72.Td2a8ffreticulumTff7b72.Td2a8fftransport_enabledTff7b72.Td2a8ffreturn_value Tff7b72= Tff7b72True
Te6edf3config_dict Tff7b72= Te6edf3mock_appTff7b72.Td2a8ffget_config_dictTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3config_dictTb4b4b4[Ta5d6ff"Ta5d6ffdisplay_nameTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffTestTa5d6ff"
Tff7b72assert Te6edf3config_dictTb4b4b4[Ta5d6ff"Ta5d6ffthemeTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6fflightTa5d6ff"
Tff7b72assert Te6edf3config_dictTb4b4b4[Ta5d6ff"Ta5d6ffis_transport_enabledTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72True
Tff7b72assert Te6edf3config_dictTb4b4b4[Ta5d6ff"Ta5d6ffidentity_public_keyTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffa1Ta5d6ff" Tff7b72* T79c0ff32
Tff7b72assert Ta5d6ff"Ta5d6ffnomad_default_page_pathTa5d6ff" Tff7b72in Te6edf3config_dict
Tff7b72assert Ta5d6ff"Ta5d6ffnomad_render_markdown_enabledTa5d6ff" Tff7b72in Te6edf3config_dict
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_update_config_nomad_rendererTb4b4b4(Te6edf3mock_appTb4b4b4)Tb4b4b4:
Te6edf3mock_appTff7b72.Td2a8ffsend_config_to_websocket_clients Tff7b72= Te6edf3MagicMockTb4b4b4(Te6edf3return_valueTff7b72=Te6edf3asyncioTff7b72.Td2a8ffFutureTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3mock_appTff7b72.Td2a8ffsend_config_to_websocket_clientsTff7b72.Td2a8ffreturn_valueTff7b72.Td2a8ffset_resultTb4b4b4(Tff7b72NoneTb4b4b4)
Tff7b72for Te6edf3name Tff7b72in Tb4b4b4(
Ta5d6ff"Ta5d6ffnomad_render_markdown_enabledTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffnomad_render_html_enabledTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffnomad_render_plaintext_enabledTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffnomad_default_page_pathTa5d6ff"Tb4b4b4,
Tb4b4b4)Tb4b4b4:
Tffa657setattrTb4b4b4(Te6edf3mock_appTff7b72.Td2a8ffconfigTb4b4b4, Te6edf3nameTb4b4b4, Te6edf3MagicMockTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72await Te6edf3mock_appTff7b72.Td2a8ffupdate_configTb4b4b4(
Tb4b4b4{
Ta5d6ff"Ta5d6ffnomad_render_markdown_enabledTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4,
Ta5d6ff"Ta5d6ffnomad_render_html_enabledTa5d6ff"Tb4b4b4: Tff7b72TrueTb4b4b4,
Ta5d6ff"Ta5d6ffnomad_render_plaintext_enabledTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4,
Ta5d6ff"Ta5d6ffnomad_default_page_pathTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ff/page/index.htmlTa5d6ff"Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Te6edf3mock_appTff7b72.Td2a8ffconfigTff7b72.Td2a8ffnomad_render_markdown_enabledTff7b72.Td2a8ffsetTff7b72.Td2a8ffassert_called_withTb4b4b4(Tff7b72FalseTb4b4b4)
Te6edf3mock_appTff7b72.Td2a8ffconfigTff7b72.Td2a8ffnomad_render_html_enabledTff7b72.Td2a8ffsetTff7b72.Td2a8ffassert_called_withTb4b4b4(Tff7b72TrueTb4b4b4)
Te6edf3mock_appTff7b72.Td2a8ffconfigTff7b72.Td2a8ffnomad_render_plaintext_enabledTff7b72.Td2a8ffsetTff7b72.Td2a8ffassert_called_withTb4b4b4(Tff7b72FalseTb4b4b4)
Te6edf3mock_appTff7b72.Td2a8ffconfigTff7b72.Td2a8ffnomad_default_page_pathTff7b72.Td2a8ffsetTff7b72.Td2a8ffassert_called_withTb4b4b4(Ta5d6ff"Ta5d6ff/page/index.htmlTa5d6ff"Tb4b4b4)
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_update_config_nomad_default_page_path_empty_resetsTb4b4b4(Te6edf3mock_appTb4b4b4)Tb4b4b4:
Te6edf3mock_appTff7b72.Td2a8ffsend_config_to_websocket_clients Tff7b72= Te6edf3MagicMockTb4b4b4(Te6edf3return_valueTff7b72=Te6edf3asyncioTff7b72.Td2a8ffFutureTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3mock_appTff7b72.Td2a8ffsend_config_to_websocket_clientsTff7b72.Td2a8ffreturn_valueTff7b72.Td2a8ffset_resultTb4b4b4(Tff7b72NoneTb4b4b4)
Te6edf3mock_appTff7b72.Td2a8ffconfigTff7b72.Td2a8ffnomad_default_page_path Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Tff7b72await Te6edf3mock_appTff7b72.Td2a8ffupdate_configTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6ffnomad_default_page_pathTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ff"Tb4b4b4}Tb4b4b4)
Te6edf3mock_appTff7b72.Td2a8ffconfigTff7b72.Td2a8ffnomad_default_page_pathTff7b72.Td2a8ffsetTff7b72.Td2a8ffassert_called_withTb4b4b4(Ta5d6ff"Ta5d6ff/page/index.muTa5d6ff"Tb4b4b4)
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_update_config_nomad_default_page_path_invalid_skippedTb4b4b4(Te6edf3mock_appTb4b4b4)Tb4b4b4:
Te6edf3mock_appTff7b72.Td2a8ffsend_config_to_websocket_clients Tff7b72= Te6edf3MagicMockTb4b4b4(Te6edf3return_valueTff7b72=Te6edf3asyncioTff7b72.Td2a8ffFutureTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3mock_appTff7b72.Td2a8ffsend_config_to_websocket_clientsTff7b72.Td2a8ffreturn_valueTff7b72.Td2a8ffset_resultTb4b4b4(Tff7b72NoneTb4b4b4)
Te6edf3mock_appTff7b72.Td2a8ffconfigTff7b72.Td2a8ffnomad_default_page_path Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Tff7b72await Te6edf3mock_appTff7b72.Td2a8ffupdate_configTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6ffnomad_default_page_pathTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ff/page/../../etc/passwdTa5d6ff"Tb4b4b4}Tb4b4b4)
Te6edf3mock_appTff7b72.Td2a8ffconfigTff7b72.Td2a8ffnomad_default_page_pathTff7b72.Td2a8ffsetTff7b72.Td2a8ffassert_not_calledTb4b4b4(Tb4b4b4)
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_lxm_ingest_uri_lxma_adds_contactTb4b4b4(Te6edf3mock_appTb4b4b4)Tb4b4b4:
Te6edf3mock_appTff7b72.Td2a8ffdatabaseTff7b72.Td2a8ffcontactsTff7b72.Td2a8ffget_contact_by_identity_hashTff7b72.Td2a8ffreturn_value Tff7b72= Tff7b72None
Te6edf3mock_appTff7b72.Td2a8ffdatabaseTff7b72.Td2a8ffcontactsTff7b72.Td2a8ffadd_contact Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3mock_appTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffingest_lxm_uri Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3mock_client Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3mock_clientTff7b72.Td2a8ffsend_str Tff7b72= Te6edf3MagicMockTb4b4b4(Te6edf3return_valueTff7b72=Te6edf3asyncioTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4)
Te6edf3fake_identity Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3fake_identityTff7b72.Td2a8ffhash Tff7b72= Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Ta5d6ff"Ta5d6ffbbTa5d6ff" Tff7b72* T79c0ff16Tb4b4b4)
Te6edf3fake_identityTff7b72.Td2a8ffload_public_keyTff7b72.Td2a8ffreturn_value Tff7b72= Tff7b72True
Tff7b72with Tb4b4b4(
Te6edf3patchTb4b4b4(
Ta5d6ff"Ta5d6ffmeshchatx.meshchat.AsyncUtils.run_asyncTa5d6ff"Tb4b4b4,
Te6edf3side_effectTff7b72=Tff7b72lambda Te6edf3coroTb4b4b4: Te6edf3asyncioTff7b72.Td2a8ffcreate_taskTb4b4b4(Te6edf3coroTb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.meshchat.RNS.IdentityTa5d6ff"Tb4b4b4, Te6edf3return_valueTff7b72=Te6edf3fake_identityTb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4:
Tff7b72await Te6edf3mock_appTff7b72.Td2a8ffon_websocket_data_receivedTb4b4b4(
Te6edf3mock_clientTb4b4b4,
Tb4b4b4{
Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6fflxm.ingest_uriTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffuriTa5d6ff"Tb4b4b4: Ta5d6fffTa5d6ff"Ta5d6fflxma://Tffd700{Ta5d6ff'Ta5d6ffaaTa5d6ff' Tff7b72* T79c0ff16Tffd700}Ta5d6ff:Tffd700{Ta5d6ff'Ta5d6ff11Ta5d6ff' Tff7b72* T79c0ff64Tffd700}Ta5d6ff"Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tff7b72await Te6edf3asyncioTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0Tb4b4b4)
Te6edf3mock_appTff7b72.Td2a8ffdatabaseTff7b72.Td2a8ffcontactsTff7b72.Td2a8ffadd_contactTff7b72.Td2a8ffassert_called_once_withTb4b4b4(
Ta5d6ff"Ta5d6ffContact aaaaaaaaTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbTa5d6ff"Tb4b4b4,
Te6edf3lxmf_addressTff7b72=Ta5d6ff"Ta5d6ffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTa5d6ff"Tb4b4b4,
Tb4b4b4)
Te6edf3mock_appTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffingest_lxm_uriTff7b72.Td2a8ffassert_not_calledTb4b4b4(Tb4b4b4)
Te6edf3mock_clientTff7b72.Td2a8ffsend_strTff7b72.Td2a8ffassert_called_onceTb4b4b4(Tb4b4b4)
Te6edf3payload Tff7b72= Te6edf3jsonTff7b72.Td2a8ffloadsTb4b4b4(Te6edf3mock_clientTff7b72.Td2a8ffsend_strTff7b72.Td2a8ffcall_argsTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4)
Tff7b72assert Te6edf3payloadTb4b4b4[Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6fflxm.ingest_uri.resultTa5d6ff"
Tff7b72assert Te6edf3payloadTb4b4b4[Ta5d6ff"Ta5d6ffstatusTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffsuccessTa5d6ff"
Tff7b72assert Te6edf3payloadTb4b4b4[Ta5d6ff"Ta5d6ffingest_typeTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6fflxma_contactTa5d6ff"
Tff7b72assert Te6edf3payloadTb4b4b4[Ta5d6ff"Ta5d6ffdestination_hashTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTa5d6ff"
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_lxm_ingest_uri_lxma_accepts_128_hex_public_keyTb4b4b4(Te6edf3mock_appTb4b4b4)Tb4b4b4:
T8b949e"""64-byte RNS public keys must load from full material, not only the first 32 bytes."""
Te6edf3mock_appTff7b72.Td2a8ffdatabaseTff7b72.Td2a8ffcontactsTff7b72.Td2a8ffget_contact_by_identity_hashTff7b72.Td2a8ffreturn_value Tff7b72= Tff7b72None
Te6edf3mock_appTff7b72.Td2a8ffdatabaseTff7b72.Td2a8ffcontactsTff7b72.Td2a8ffadd_contact Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3mock_appTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffingest_lxm_uri Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3mock_client Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3mock_clientTff7b72.Td2a8ffsend_str Tff7b72= Te6edf3MagicMockTb4b4b4(Te6edf3return_valueTff7b72=Te6edf3asyncioTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4)
Te6edf3fake_identity Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3fake_identityTff7b72.Td2a8ffhash Tff7b72= Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Ta5d6ff"Ta5d6ffbbTa5d6ff" Tff7b72* T79c0ff16Tb4b4b4)
Tff7b72def Td2a8ffload_public_keyTb4b4b4(Te6edf3key_bytesTb4b4b4)Tb4b4b4:
Tff7b72return Tffa657lenTb4b4b4(Te6edf3key_bytesTb4b4b4) Tff7b72== T79c0ff64
Te6edf3fake_identityTff7b72.Td2a8ffload_public_keyTff7b72.Td2a8ffside_effect Tff7b72= Te6edf3load_public_key
Tff7b72with Tb4b4b4(
Te6edf3patchTb4b4b4(
Ta5d6ff"Ta5d6ffmeshchatx.meshchat.AsyncUtils.run_asyncTa5d6ff"Tb4b4b4,
Te6edf3side_effectTff7b72=Tff7b72lambda Te6edf3coroTb4b4b4: Te6edf3asyncioTff7b72.Td2a8ffcreate_taskTb4b4b4(Te6edf3coroTb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.meshchat.RNS.IdentityTa5d6ff"Tb4b4b4, Te6edf3return_valueTff7b72=Te6edf3fake_identityTb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4:
Tff7b72await Te6edf3mock_appTff7b72.Td2a8ffon_websocket_data_receivedTb4b4b4(
Te6edf3mock_clientTb4b4b4,
Tb4b4b4{
Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6fflxm.ingest_uriTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffuriTa5d6ff"Tb4b4b4: Ta5d6fffTa5d6ff"Ta5d6fflxma://Tffd700{Ta5d6ff'Ta5d6ffaaTa5d6ff' Tff7b72* T79c0ff16Tffd700}Ta5d6ff:Tffd700{Ta5d6ff'Ta5d6ff1Ta5d6ff' Tff7b72* T79c0ff128Tffd700}Ta5d6ff"Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tff7b72await Te6edf3asyncioTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0Tb4b4b4)
Te6edf3mock_appTff7b72.Td2a8ffdatabaseTff7b72.Td2a8ffcontactsTff7b72.Td2a8ffadd_contactTff7b72.Td2a8ffassert_called_onceTb4b4b4(Tb4b4b4)
Te6edf3payload Tff7b72= Te6edf3jsonTff7b72.Td2a8ffloadsTb4b4b4(Te6edf3mock_clientTff7b72.Td2a8ffsend_strTff7b72.Td2a8ffcall_argsTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4)
Tff7b72assert Te6edf3payloadTb4b4b4[Ta5d6ff"Ta5d6ffstatusTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffsuccessTa5d6ff"
Tff7b72assert Te6edf3payloadTb4b4b4[Ta5d6ff"Ta5d6ffingest_typeTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6fflxma_contactTa5d6ff"
Tff7b72assert Te6edf3fake_identityTff7b72.Td2a8ffload_public_keyTff7b72.Td2a8ffcall_count Tff7b72>Tff7b72= T79c0ff1
Tff7b72assert Tffa657lenTb4b4b4(Te6edf3fake_identityTff7b72.Td2a8ffload_public_keyTff7b72.Td2a8ffcall_argsTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4) Tff7b72== T79c0ff64
Tff7b72def Td2a8fftest_db_upsert_lxmf_message_basicTb4b4b4(Te6edf3mock_appTb4b4b4)Tb4b4b4:
Te6edf3mock_msg Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3mock_msgTff7b72.Td2a8ffhash Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ffhTa5d6ff" Tff7b72* T79c0ff16
Te6edf3mock_msgTff7b72.Td2a8ffsource_hash Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ffsTa5d6ff" Tff7b72* T79c0ff16
Te6edf3mock_msgTff7b72.Td2a8ffdestination_hash Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ffdTa5d6ff" Tff7b72* T79c0ff16
Te6edf3mock_msgTff7b72.Td2a8ffcontent Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ffHelloTa5d6ff"
Te6edf3mock_msgTff7b72.Td2a8ffget_fieldsTff7b72.Td2a8ffreturn_value Tff7b72= Tb4b4b4{Tb4b4b4}
Te6edf3mock_msgTff7b72.Td2a8fftimestamp Tff7b72= T79c0ff123456789
Te6edf3mock_msgTff7b72.Td2a8ffprogress Tff7b72= T79c0ff0.5
Te6edf3mock_msgTff7b72.Td2a8ffincoming Tff7b72= Tff7b72True
Te6edf3mock_msgTff7b72.Td2a8ffstate Tff7b72= T79c0ff0
Te6edf3mock_msgTff7b72.Td2a8ffmethod Tff7b72= T79c0ff0
Te6edf3mock_msgTff7b72.Td2a8ffdelivery_attempts Tff7b72= T79c0ff0
Te6edf3mock_msgTff7b72.Td2a8fftitle Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ff"
Te6edf3mock_msgTff7b72.Td2a8ffrssi Tff7b72= Tff7b72None
Te6edf3mock_msgTff7b72.Td2a8ffsnr Tff7b72= Tff7b72None
Te6edf3mock_msgTff7b72.Td2a8ffq Tff7b72= Tff7b72None
Te6edf3mock_appTff7b72.Td2a8ffcurrent_contextTff7b72.Td2a8fflocal_lxmf_destinationTff7b72.Td2a8ffhexhash Tff7b72= Ta5d6ff"Ta5d6fflocalTa5d6ff"
Te6edf3mock_appTff7b72.Td2a8ffdb_upsert_lxmf_messageTb4b4b4(Te6edf3mock_msgTb4b4b4)
Te6edf3mock_appTff7b72.Td2a8ffcurrent_contextTff7b72.Td2a8ffdatabaseTff7b72.Td2a8ffmessagesTff7b72.Td2a8ffupsert_lxmf_messageTff7b72.Td2a8ffassert_called_onceTb4b4b4(Tb4b4b4)
Te6edf3argsTb4b4b4, Te6edf3_ Tff7b72= Te6edf3mock_appTff7b72.Td2a8ffcurrent_contextTff7b72.Td2a8ffdatabaseTff7b72.Td2a8ffmessagesTff7b72.Td2a8ffupsert_lxmf_messageTff7b72.Td2a8ffcall_args
Tff7b72assert Te6edf3argsTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffcontentTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffHelloTa5d6ff"
Tff7b72assert Te6edf3argsTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffpeer_hashTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ff73737373737373737373737373737373Ta5d6ff" T8b949e# Hex of b"s"*16
Tff7b72def Td2a8fftest_get_lxmf_conversation_nameTb4b4b4(Te6edf3mock_appTb4b4b4)Tb4b4b4:
Te6edf3mock_appTff7b72.Td2a8ffdatabaseTff7b72.Td2a8ffannouncesTff7b72.Td2a8ffget_announce_by_hashTff7b72.Td2a8ffreturn_value Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffapp_dataTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffbase64dataTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffdestination_hashTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffdestTa5d6ff"Tb4b4b4,
Tb4b4b4}
Tff7b72with Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.meshchat.parse_lxmf_display_nameTa5d6ff"Tb4b4b4, Te6edf3return_valueTff7b72=Ta5d6ff"Ta5d6ffPeer NameTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3name Tff7b72= Te6edf3mock_appTff7b72.Td2a8ffget_lxmf_conversation_nameTb4b4b4(Ta5d6ff"Ta5d6ffdestTa5d6ff"Tb4b4b4)
Tff7b72assert Te6edf3name Tff7b72== Ta5d6ff"Ta5d6ffPeer NameTa5d6ff"
Tff7b72def Td2a8fftest_get_lxmf_conversation_name_defaultTb4b4b4(Te6edf3mock_appTb4b4b4)Tb4b4b4:
Te6edf3mock_appTff7b72.Td2a8ffdatabaseTff7b72.Td2a8ffannouncesTff7b72.Td2a8ffget_announce_by_hashTff7b72.Td2a8ffreturn_value Tff7b72= Tff7b72None
Te6edf3name Tff7b72= Te6edf3mock_appTff7b72.Td2a8ffget_lxmf_conversation_nameTb4b4b4(Ta5d6ff"Ta5d6ffdestTa5d6ff"Tb4b4b4, Te6edf3default_nameTff7b72=Ta5d6ff"Ta5d6ffDefaultTa5d6ff"Tb4b4b4)
Tff7b72assert Te6edf3name Tff7b72== Ta5d6ff"Ta5d6ffDefaultTa5d6ff"
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_send_config_to_websocket_clientsTb4b4b4(Te6edf3mock_appTb4b4b4)Tb4b4b4:
Te6edf3mock_appTff7b72.Td2a8ffwebsocket_broadcast Tff7b72= Te6edf3MagicMockTb4b4b4(Te6edf3return_valueTff7b72=Te6edf3asyncioTff7b72.Td2a8ffFutureTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3mock_appTff7b72.Td2a8ffwebsocket_broadcastTff7b72.Td2a8ffreturn_valueTff7b72.Td2a8ffset_resultTb4b4b4(Tff7b72NoneTb4b4b4)
Te6edf3mock_appTff7b72.Td2a8ffget_config_dict Tff7b72= Te6edf3MagicMockTb4b4b4(Te6edf3return_valueTff7b72=Tb4b4b4{Ta5d6ff"Ta5d6ffconfTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffvalTa5d6ff"Tb4b4b4}Tb4b4b4)
Tff7b72await Te6edf3mock_appTff7b72.Td2a8ffsend_config_to_websocket_clientsTb4b4b4(Tb4b4b4)
Te6edf3mock_appTff7b72.Td2a8ffwebsocket_broadcastTff7b72.Td2a8ffassert_called_onceTb4b4b4(Tb4b4b4)
Te6edf3argsTb4b4b4, Te6edf3_ Tff7b72= Te6edf3mock_appTff7b72.Td2a8ffwebsocket_broadcastTff7b72.Td2a8ffcall_args
Te6edf3payload Tff7b72= Te6edf3jsonTff7b72.Td2a8ffloadsTb4b4b4(Te6edf3argsTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4)
Tff7b72assert Te6edf3payloadTb4b4b4[Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffconfigTa5d6ff"
Tff7b72assert Te6edf3payloadTb4b4b4[Ta5d6ff"Ta5d6ffconfigTa5d6ff"Tb4b4b4] Tff7b72== Tb4b4b4{Ta5d6ff"Ta5d6ffconfTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffvalTa5d6ff"Tb4b4b4}
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_on_lxmf_sending_state_updatedTb4b4b4(Te6edf3mock_appTb4b4b4)Tb4b4b4:
Te6edf3mock_msg Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3mock_msgTff7b72.Td2a8ffprogress Tff7b72= T79c0ff0.75
Te6edf3mock_msgTff7b72.Td2a8ffrssi Tff7b72= Tff7b72None
Te6edf3mock_msgTff7b72.Td2a8ffsnr Tff7b72= Tff7b72None
Te6edf3mock_msgTff7b72.Td2a8ffq Tff7b72= Tff7b72None
Te6edf3mock_msgTff7b72.Td2a8ffhashTff7b72.Td2a8ffhexTff7b72.Td2a8ffreturn_value Tff7b72= Ta5d6ff"Ta5d6ffabTa5d6ff" Tff7b72* T79c0ff16
Te6edf3mock_msgTff7b72.Td2a8ffdelivery_attempts Tff7b72= T79c0ff2
Te6edf3ctx Tff7b72= Te6edf3mock_appTff7b72.Td2a8ffcurrent_context
Te6edf3mock_appTff7b72.Td2a8ffwebsocket_broadcast Tff7b72= Te6edf3MagicMockTb4b4b4(Te6edf3return_valueTff7b72=Te6edf3asyncioTff7b72.Td2a8ffFutureTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3mock_appTff7b72.Td2a8ffwebsocket_broadcastTff7b72.Td2a8ffreturn_valueTff7b72.Td2a8ffset_resultTb4b4b4(Tff7b72NoneTb4b4b4)
Tff7b72with Tb4b4b4(
Te6edf3patchTb4b4b4(
Ta5d6ff"Ta5d6ffmeshchatx.meshchat.convert_lxmf_message_to_dictTa5d6ff"Tb4b4b4,
Te6edf3return_valueTff7b72=Tb4b4b4{Ta5d6ff"Ta5d6ffhTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffvTa5d6ff"Tb4b4b4}Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3patchTb4b4b4(
Ta5d6ff"Ta5d6ffmeshchatx.meshchat.convert_lxmf_state_to_stringTa5d6ff"Tb4b4b4,
Te6edf3return_valueTff7b72=Ta5d6ff"Ta5d6ffdeliveredTa5d6ff"Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3patchTb4b4b4(
Ta5d6ff"Ta5d6ffmeshchatx.meshchat.convert_lxmf_method_to_stringTa5d6ff"Tb4b4b4,
Te6edf3return_valueTff7b72=Ta5d6ff"Ta5d6ffdirectTa5d6ff"Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.meshchat.AsyncUtils.run_asyncTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3mock_run_asyncTb4b4b4,
Tb4b4b4)Tb4b4b4:
Te6edf3mock_appTff7b72.Td2a8ffon_lxmf_sending_state_updatedTb4b4b4(Te6edf3mock_msgTb4b4b4, Te6edf3contextTff7b72=Te6edf3ctxTb4b4b4)
Te6edf3ctxTff7b72.Td2a8ffdatabaseTff7b72.Td2a8ffmessagesTff7b72.Td2a8ffupdate_lxmf_message_stateTff7b72.Td2a8ffassert_called_onceTb4b4b4(Tb4b4b4)
Te6edf3call_kwargs Tff7b72= Te6edf3ctxTff7b72.Td2a8ffdatabaseTff7b72.Td2a8ffmessagesTff7b72.Td2a8ffupdate_lxmf_message_stateTff7b72.Td2a8ffcall_args
Tff7b72assert Te6edf3call_kwargsTff7b72.Td2a8ffkwargsTb4b4b4[Ta5d6ff"Ta5d6ffmessage_hashTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffabTa5d6ff" Tff7b72* T79c0ff16
Tff7b72assert Te6edf3call_kwargsTff7b72.Td2a8ffkwargsTb4b4b4[Ta5d6ff"Ta5d6ffprogressTa5d6ff"Tb4b4b4] Tff7b72== T79c0ff75.0
Tff7b72assert Te6edf3call_kwargsTff7b72.Td2a8ffkwargsTb4b4b4[Ta5d6ff"Ta5d6ffstateTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffdeliveredTa5d6ff"
Tff7b72assert Te6edf3call_kwargsTff7b72.Td2a8ffkwargsTb4b4b4[Ta5d6ff"Ta5d6ffmethodTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffdirectTa5d6ff"
Te6edf3mock_run_asyncTff7b72.Td2a8ffassert_called_onceTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8fftest_on_lxmf_sending_failed_no_propagationTb4b4b4(Te6edf3mock_appTb4b4b4)Tb4b4b4:
Te6edf3mock_msg Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3mock_msgTff7b72.Td2a8ffstate Tff7b72= T79c0ff0 T8b949e# NOT FAILED
Te6edf3mock_appTff7b72.Td2a8ffon_lxmf_sending_state_updated Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3mock_appTff7b72.Td2a8ffon_lxmf_sending_failedTb4b4b4(Te6edf3mock_msgTb4b4b4)
Te6edf3mock_appTff7b72.Td2a8ffon_lxmf_sending_state_updatedTff7b72.Td2a8ffassert_called_once_withTb4b4b4(
Te6edf3mock_msgTb4b4b4,
Te6edf3contextTff7b72=Te6edf3mock_appTff7b72.Td2a8ffcurrent_contextTb4b4b4,
Tb4b4b4)
Tff7b72def Td2a8fftest_convert_webm_opus_to_ogg_already_oggTb4b4b4(Te6edf3mock_appTb4b4b4)Tb4b4b4:
Te6edf3ogg_data Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ffOggSTa5d6ff" Tff7b72+ Ta5d6ffbTa5d6ff"Tffea00\x00Ta5d6ff" Tff7b72* T79c0ff100
Te6edf3result Tff7b72= Te6edf3mock_appTff7b72.Td2a8ff_convert_webm_opus_to_oggTb4b4b4(Te6edf3ogg_dataTb4b4b4)
Tff7b72assert Te6edf3result Tff7b72is Te6edf3ogg_data
Tff7b72def Td2a8fftest_convert_webm_opus_to_ogg_undecodable_returns_inputTb4b4b4(Te6edf3mock_appTb4b4b4)Tb4b4b4:
T8b949e"""Unknown containers (e.g. legacy WebM) fall through unchanged."""
Te6edf3webm_data Tff7b72= Ta5d6ffbTa5d6ff"Tffea00\x1aTffea00\x45Tffea00\xdfTffea00\xa3Ta5d6ff" Tff7b72+ Ta5d6ffbTa5d6ff"Tffea00\x00Ta5d6ff" Tff7b72* T79c0ff100
Te6edf3result Tff7b72= Te6edf3mock_appTff7b72.Td2a8ff_convert_webm_opus_to_oggTb4b4b4(Te6edf3webm_dataTb4b4b4)
Tff7b72assert Te6edf3result Tff7b72is Te6edf3webm_data
Tff7b72def Td2a8ff_build_wav_pcm16Tb4b4b4(Te6edf3samplerateTff7b72=T79c0ff48000Tb4b4b4, Te6edf3duration_secondsTff7b72=T79c0ff0.5Tb4b4b4, Te6edf3frequencyTff7b72=T79c0ff440.0Tb4b4b4)Tb4b4b4:
Tff7b72import T7ee787io
Tff7b72import T7ee787math
Tff7b72import T7ee787struct
Tff7b72import T7ee787wave
Te6edf3n_samples Tff7b72= Tffa657intTb4b4b4(Te6edf3samplerate Tff7b72* Te6edf3duration_secondsTb4b4b4)
Te6edf3buf Tff7b72= Te6edf3ioTff7b72.Td2a8ffBytesIOTb4b4b4(Tb4b4b4)
Tff7b72with Te6edf3waveTff7b72.Td2a8ffopenTb4b4b4(Te6edf3bufTb4b4b4, Ta5d6ff"Ta5d6ffwbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3wfTb4b4b4:
Te6edf3wfTff7b72.Td2a8ffsetnchannelsTb4b4b4(T79c0ff1Tb4b4b4)
Te6edf3wfTff7b72.Td2a8ffsetsampwidthTb4b4b4(T79c0ff2Tb4b4b4)
Te6edf3wfTff7b72.Td2a8ffsetframerateTb4b4b4(Te6edf3samplerateTb4b4b4)
Te6edf3frames Tff7b72= Tffa657bytearrayTb4b4b4(Tb4b4b4)
Tff7b72for Te6edf3i Tff7b72in Tffa657rangeTb4b4b4(Te6edf3n_samplesTb4b4b4)Tb4b4b4:
Te6edf3sample Tff7b72= Tffa657intTb4b4b4(
T79c0ff0.3 Tff7b72* T79c0ff32767 Tff7b72* Te6edf3mathTff7b72.Td2a8ffsinTb4b4b4(T79c0ff2 Tff7b72* Te6edf3mathTff7b72.Td2a8ffpi Tff7b72* Te6edf3frequency Tff7b72* Tb4b4b4(Te6edf3i Tff7b72/ Te6edf3samplerateTb4b4b4)Tb4b4b4)
Tb4b4b4)
Te6edf3framesTff7b72.Td2a8ffextendTb4b4b4(Te6edf3structTff7b72.Td2a8ffpackTb4b4b4(Ta5d6ff"Ta5d6ff<hTa5d6ff"Tb4b4b4, Te6edf3sampleTb4b4b4)Tb4b4b4)
Te6edf3wfTff7b72.Td2a8ffwriteframesTb4b4b4(Tffa657bytesTb4b4b4(Te6edf3framesTb4b4b4)Tb4b4b4)
Tff7b72return Te6edf3bufTff7b72.Td2a8ffgetvalueTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8fftest_convert_webm_opus_to_ogg_wav_uses_audio_codecTb4b4b4(Te6edf3mock_appTb4b4b4)Tb4b4b4:
T8b949e"""WAV input is routed through audio_codec, no subprocess fallback."""
Te6edf3wav_bytes Tff7b72= Te6edf3_build_wav_pcm16Tb4b4b4(Tb4b4b4)
Te6edf3fake_ogg Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ffOggSTa5d6ff" Tff7b72+ Ta5d6ffbTa5d6ff"Tffea00\x42Ta5d6ff" Tff7b72* T79c0ff64
Tff7b72with Tb4b4b4(
Te6edf3patchTb4b4b4(
Ta5d6ff"Ta5d6ffmeshchatx.src.backend.audio_codec.encode_audio_bytes_to_ogg_opusTa5d6ff"Tb4b4b4,
Te6edf3return_valueTff7b72=Te6edf3fake_oggTb4b4b4,
Tb4b4b4) Tff7b72as Te6edf3mock_encodeTb4b4b4,
Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffsubprocess.runTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3mock_runTb4b4b4,
Tb4b4b4)Tb4b4b4:
Te6edf3result Tff7b72= Te6edf3mock_appTff7b72.Td2a8ff_convert_webm_opus_to_oggTb4b4b4(Te6edf3wav_bytesTb4b4b4)
Tff7b72assert Te6edf3result Tff7b72== Te6edf3fake_ogg
Te6edf3mock_encodeTff7b72.Td2a8ffassert_called_once_withTb4b4b4(Te6edf3wav_bytesTb4b4b4)
Te6edf3mock_runTff7b72.Td2a8ffassert_not_calledTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8fftest_convert_webm_opus_to_ogg_wav_falls_through_when_codec_failsTb4b4b4(Te6edf3mock_appTb4b4b4)Tb4b4b4:
Te6edf3wav_bytes Tff7b72= Te6edf3_build_wav_pcm16Tb4b4b4(Tb4b4b4)
Tff7b72with Te6edf3patchTb4b4b4(
Ta5d6ff"Ta5d6ffmeshchatx.src.backend.audio_codec.encode_audio_bytes_to_ogg_opusTa5d6ff"Tb4b4b4,
Te6edf3return_valueTff7b72=Tff7b72NoneTb4b4b4,
Tb4b4b4)Tb4b4b4:
Te6edf3result Tff7b72= Te6edf3mock_appTff7b72.Td2a8ff_convert_webm_opus_to_oggTb4b4b4(Te6edf3wav_bytesTb4b4b4)
Tff7b72assert Te6edf3result Tff7b72is Te6edf3wav_bytes
Tff7b72def Td2a8fftest_encode_pcm_wav_to_ogg_opus_produces_oggTb4b4b4(Te6edf3mock_appTb4b4b4)Tb4b4b4:
T8b949e"""The WAV->OGG/Opus wrapper still produces a valid OGG container."""
Te6edf3wav_bytes Tff7b72= Te6edf3_build_wav_pcm16Tb4b4b4(Tb4b4b4)
Te6edf3encoded Tff7b72= Te6edf3mock_appTff7b72.Td2a8ff_encode_pcm_wav_to_ogg_opusTb4b4b4(Te6edf3wav_bytesTb4b4b4)
Tff7b72assert Te6edf3encoded Tff7b72is Tff7b72not Tff7b72None
Tff7b72assert Te6edf3encodedTb4b4b4[Tb4b4b4:T79c0ff4Tb4b4b4] Tff7b72== Ta5d6ffbTa5d6ff"Ta5d6ffOggSTa5d6ff"
Tff7b72assert Tffa657lenTb4b4b4(Te6edf3encodedTb4b4b4) Tff7b72> T79c0ff0
Tff7b72assert Tffa657lenTb4b4b4(Te6edf3encodedTb4b4b4) Tff7b72< Tffa657lenTb4b4b4(Te6edf3wav_bytesTb4b4b4)
Tff7b72def Td2a8fftest_encode_pcm_wav_to_ogg_opus_invalid_returns_noneTb4b4b4(Te6edf3mock_appTb4b4b4)Tb4b4b4:
Tff7b72assert Te6edf3mock_appTff7b72.Td2a8ff_encode_pcm_wav_to_ogg_opusTb4b4b4(Ta5d6ffbTa5d6ff"Ta5d6ffnot a wav file at allTa5d6ff"Tb4b4b4) Tff7b72is Tff7b72None
Tff7b72def Td2a8fftest_convert_webm_opus_to_ogg_audio_codec_exceptionTb4b4b4(Te6edf3mock_appTb4b4b4)Tb4b4b4:
T8b949e"""Exceptions inside the codec helper degrade gracefully."""
Te6edf3webm_data Tff7b72= Ta5d6ffbTa5d6ff"Tffea00\x1aTffea00\x45Tffea00\xdfTffea00\xa3Ta5d6ff" Tff7b72+ Ta5d6ffbTa5d6ff"Tffea00\x00Ta5d6ff" Tff7b72* T79c0ff100
Tff7b72with Te6edf3patchTb4b4b4(
Ta5d6ff"Ta5d6ffmeshchatx.src.backend.audio_codec.encode_audio_bytes_to_ogg_opusTa5d6ff"Tb4b4b4,
Te6edf3side_effectTff7b72=Tf85149RuntimeErrorTb4b4b4(Ta5d6ff"Ta5d6ffboomTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4:
Te6edf3result Tff7b72= Te6edf3mock_appTff7b72.Td2a8ff_convert_webm_opus_to_oggTb4b4b4(Te6edf3webm_dataTb4b4b4)
Tff7b72assert Te6edf3result Tff7b72is Te6edf3webm_data
Tf0883e@pytestTff7b72.Td2a8fffixture
Tff7b72def Td2a8ffsendable_appTb4b4b4(Te6edf3mock_appTb4b4b4)Tb4b4b4:
T8b949e"""mock_app wired so send_message can run to completion."""
Te6edf3ctx Tff7b72= Te6edf3mock_appTff7b72.Td2a8ffcurrent_context
Te6edf3ctxTff7b72.Td2a8ffconfigTff7b72.Td2a8ffauto_send_failed_messages_to_propagation_nodeTff7b72.Td2a8ffgetTff7b72.Td2a8ffreturn_value Tff7b72= Tff7b72False
Te6edf3ctxTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffdelivery_link_availableTff7b72.Td2a8ffreturn_value Tff7b72= Tff7b72True
Te6edf3ctxTff7b72.Td2a8fflocal_lxmf_destination Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3ctxTff7b72.Td2a8ffforwarding_manager Tff7b72= Tff7b72None
Te6edf3mock_appTff7b72.Td2a8ff_await_transport_path Tff7b72= Te6edf3AsyncMockTb4b4b4(
Te6edf3return_valueTff7b72=Te6edf3OutboundPathOutcomeTb4b4b4(Tff7b72TrueTb4b4b4, Ta5d6ff"Ta5d6ffreused_valid_pathTa5d6ff"Tb4b4b4, Tff7b72FalseTb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3mock_appTff7b72.Td2a8ffget_current_icon_hash Tff7b72= Te6edf3MagicMockTb4b4b4(Te6edf3return_valueTff7b72=Tff7b72NoneTb4b4b4)
Te6edf3mock_appTff7b72.Td2a8ffdb_upsert_lxmf_message Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3mock_appTff7b72.Td2a8ffwebsocket_broadcast Tff7b72= Te6edf3AsyncMockTb4b4b4(Tb4b4b4)
Te6edf3mock_appTff7b72.Td2a8ffhandle_lxmf_message_progress Tff7b72= Te6edf3AsyncMockTb4b4b4(Tb4b4b4)
Te6edf3mock_appTff7b72.Td2a8ff_convert_webm_opus_to_ogg Tff7b72= Te6edf3MagicMockTb4b4b4(Te6edf3side_effectTff7b72=Tff7b72lambda Te6edf3bTb4b4b4: Te6edf3bTb4b4b4)
Tff7b72return Te6edf3mock_app
Tff7b72async Tff7b72def Td2a8ff_run_sendTb4b4b4(Te6edf3appTb4b4b4, Te6edf3destination_hashTff7b72=Ta5d6ff"Ta5d6ffaaTa5d6ff" Tff7b72* T79c0ff16Tb4b4b4, Tff7b72*Tff7b72*Te6edf3kwargsTb4b4b4)Tb4b4b4:
Te6edf3fake_identity Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3fake_destination Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3fake_lxm Tff7b72= Te6edf3MagicMockTb4b4b4(Te6edf3specTff7b72=Te6edf3LXMFTff7b72.Td2a8ffLXMessageTb4b4b4)
Te6edf3fake_lxmTff7b72.Td2a8fffields Tff7b72= Tb4b4b4{Tb4b4b4}
Te6edf3fake_lxmTff7b72.Td2a8ffinclude_ticket Tff7b72= Tff7b72False
Te6edf3appTff7b72.Td2a8ffrecall_identity Tff7b72= Te6edf3MagicMockTb4b4b4(Te6edf3return_valueTff7b72=Te6edf3fake_identityTb4b4b4)
Tff7b72with Tb4b4b4(
Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.meshchat.RNS.DestinationTa5d6ff"Tb4b4b4, Te6edf3return_valueTff7b72=Te6edf3fake_destinationTb4b4b4)Tb4b4b4,
Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.meshchat.LXMF.LXMessageTa5d6ff"Tb4b4b4, Te6edf3return_valueTff7b72=Te6edf3fake_lxmTb4b4b4)Tb4b4b4,
Te6edf3patchTb4b4b4(
Ta5d6ff"Ta5d6ffmeshchatx.meshchat.convert_lxmf_message_to_dictTa5d6ff"Tb4b4b4,
Te6edf3return_valueTff7b72=Tb4b4b4{Ta5d6ff"Ta5d6ffhashTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffxTa5d6ff"Tb4b4b4}Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.meshchat.AsyncUtils.run_asyncTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4:
Tff7b72await Te6edf3appTff7b72.Td2a8ffsend_messageTb4b4b4(
Te6edf3destination_hashTff7b72=Te6edf3destination_hashTb4b4b4,
Te6edf3contentTff7b72=Ta5d6ff"Ta5d6ffhiTa5d6ff"Tb4b4b4,
Tff7b72*Tff7b72*Te6edf3kwargsTb4b4b4,
Tb4b4b4)
Tff7b72return Te6edf3fake_lxm
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_send_message_sets_renderer_markdownTb4b4b4(Te6edf3sendable_appTb4b4b4)Tb4b4b4:
Te6edf3lxm Tff7b72= Tff7b72await Te6edf3_run_sendTb4b4b4(Te6edf3sendable_appTb4b4b4)
Tff7b72assert Te6edf3LXMFTff7b72.Td2a8ffFIELD_RENDERER Tff7b72in Te6edf3lxmTff7b72.Td2a8fffields
Tff7b72assert Te6edf3lxmTff7b72.Td2a8fffieldsTb4b4b4[Te6edf3LXMFTff7b72.Td2a8ffFIELD_RENDERERTb4b4b4] Tff7b72== Te6edf3LXMFTff7b72.Td2a8ffRENDERER_MARKDOWN
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_send_message_include_ticket_for_contactTb4b4b4(Te6edf3sendable_appTb4b4b4)Tb4b4b4:
Te6edf3sendable_appTff7b72.Td2a8ff_is_contact Tff7b72= Te6edf3MagicMockTb4b4b4(Te6edf3return_valueTff7b72=Tff7b72TrueTb4b4b4)
Te6edf3lxm Tff7b72= Tff7b72await Te6edf3_run_sendTb4b4b4(Te6edf3sendable_appTb4b4b4)
Tff7b72assert Te6edf3lxmTff7b72.Td2a8ffinclude_ticket Tff7b72is Tff7b72True
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_send_message_no_ticket_for_strangerTb4b4b4(Te6edf3sendable_appTb4b4b4)Tb4b4b4:
Te6edf3sendable_appTff7b72.Td2a8ff_is_contact Tff7b72= Te6edf3MagicMockTb4b4b4(Te6edf3return_valueTff7b72=Tff7b72FalseTb4b4b4)
Te6edf3lxm Tff7b72= Tff7b72await Te6edf3_run_sendTb4b4b4(Te6edf3sendable_appTb4b4b4)
Tff7b72assert Te6edf3lxmTff7b72.Td2a8ffinclude_ticket Tff7b72is Tff7b72False
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_send_message_opus_audio_triggers_conversionTb4b4b4(Te6edf3sendable_appTb4b4b4)Tb4b4b4:
Te6edf3audio Tff7b72= Te6edf3LxmfAudioFieldTb4b4b4(Te6edf3audio_modeTff7b72=Te6edf3LXMFTff7b72.Td2a8ffAM_OPUS_OGGTb4b4b4, Te6edf3audio_bytesTff7b72=Ta5d6ffbTa5d6ff"Tffea00\x1aTffea00\x45Ta5d6ff"Tb4b4b4)
Te6edf3lxm Tff7b72= Tff7b72await Te6edf3_run_sendTb4b4b4(Te6edf3sendable_appTb4b4b4, Te6edf3audio_fieldTff7b72=Te6edf3audioTb4b4b4)
Te6edf3sendable_appTff7b72.Td2a8ff_convert_webm_opus_to_oggTff7b72.Td2a8ffassert_called_once_withTb4b4b4(Ta5d6ffbTa5d6ff"Tffea00\x1aTffea00\x45Ta5d6ff"Tb4b4b4)
Tff7b72assert Te6edf3LXMFTff7b72.Td2a8ffFIELD_AUDIO Tff7b72in Te6edf3lxmTff7b72.Td2a8fffields
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_send_message_codec2_audio_skips_conversionTb4b4b4(Te6edf3sendable_appTb4b4b4)Tb4b4b4:
Te6edf3audio Tff7b72= Te6edf3LxmfAudioFieldTb4b4b4(Te6edf3audio_modeTff7b72=Te6edf3LXMFTff7b72.Td2a8ffAM_CODEC2_1200Tb4b4b4, Te6edf3audio_bytesTff7b72=Ta5d6ffbTa5d6ff"Tffea00\xccTa5d6ff"Tb4b4b4)
Te6edf3lxm Tff7b72= Tff7b72await Te6edf3_run_sendTb4b4b4(Te6edf3sendable_appTb4b4b4, Te6edf3audio_fieldTff7b72=Te6edf3audioTb4b4b4)
Te6edf3sendable_appTff7b72.Td2a8ff_convert_webm_opus_to_oggTff7b72.Td2a8ffassert_not_calledTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3lxmTff7b72.Td2a8fffieldsTb4b4b4[Te6edf3LXMFTff7b72.Td2a8ffFIELD_AUDIOTb4b4b4] Tff7b72== Tb4b4b4[Te6edf3LXMFTff7b72.Td2a8ffAM_CODEC2_1200Tb4b4b4, Ta5d6ffbTa5d6ff"Tffea00\xccTa5d6ff"Tb4b4b4]
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────